import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import { ElMessage } from 'element-plus'
import http from '@/utils/request.ts'

// 用户信息接口定义
export interface UserInfo {
  id: number
  username: string
  nickname: string
  email?: string
  avatar?: string
  token: string
  tokenExpireTime?: string  // 可选字段，兼容后端没有返回过期时间的情况
  lastLoginTime?: string
}

// 登录请求接口
export interface LoginRequest {
  username: string
  password: string
}

export const useUserStore = defineStore('user', () => {
  // 用户信息状态
  const userInfo = ref<UserInfo | null>(null)
  
  // 登录状态
  const isLoggedIn = computed(() => {
    return userInfo.value !== null && userInfo.value.token !== ''
  })
  
  // 初始化用户状态（从localStorage恢复）
  const initUserState = () => {
    // 如果已经有用户信息，不重复初始化
    if (userInfo.value) {
      return
    }
    
    const savedUserInfo = localStorage.getItem('userInfo')
    if (savedUserInfo) {
      try {
        const parsed = JSON.parse(savedUserInfo)
        // 检查必要字段
        if (!parsed.token || !parsed.username) {
          localStorage.removeItem('userInfo')
          return
        }
        
        // 检查token是否过期（如果有过期时间的话）
        if (parsed.tokenExpireTime) {
          if (new Date(parsed.tokenExpireTime) > new Date()) {
            userInfo.value = parsed
          } else {
            // token已过期，清除本地存储
            localStorage.removeItem('userInfo')
          }
        } else {
          // 没有过期时间但有token，直接恢复状态
          userInfo.value = parsed
        }
      } catch (error) {
        console.error('解析用户信息失败:', error)
        localStorage.removeItem('userInfo')
      }
    }
  }
  
  // 用户登录
  const login = async (loginData: LoginRequest): Promise<boolean> => {
    try {
      const result = await http.post<UserInfo>('/user/login', loginData)
      
      // 登录成功，保存用户信息
      userInfo.value = result.data
      localStorage.setItem('userInfo', JSON.stringify(result.data))
      ElMessage.success('登录成功')
      return true
    } catch (error: any) {
      console.error('登录请求失败:', error)
      ElMessage.error(error.message || '登录失败')
      return false
    }
  }
  
  // 用户退出登录
  const logout = () => {
    userInfo.value = null
    localStorage.removeItem('userInfo')
    ElMessage.success('已退出登录')
  }
  
  // 检查是否需要登录
  const requireLogin = (): boolean => {
    if (!isLoggedIn.value) {
      ElMessage.warning('请先登录')
      return false
    }
    return true
  }
  
  // 获取当前用户信息
  const getCurrentUser = () => {
    return userInfo.value
  }
  
  // 更新用户信息
  const updateUserInfo = (newUserInfo: Partial<UserInfo>) => {
    if (userInfo.value) {
      userInfo.value = { ...userInfo.value, ...newUserInfo }
      localStorage.setItem('userInfo', JSON.stringify(userInfo.value))
    }
  }
  
  return {
    userInfo,
    isLoggedIn,
    initUserState,
    login,
    logout,
    requireLogin,
    getCurrentUser,
    updateUserInfo
  }
})